热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python|爬虫数据分析实战Ⅰ

“Talkischeap,Showmethecode.”翻译为中文是“废话少说,放码过来。”我觉得可谓信达雅。在编程之路上,实践的重要性无可比拟。这也是很多同学感觉学了很多,但还是

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

“Talk is cheap,Show me the code.”翻译为中文是“废话少说,放码过来。”我觉得可谓信达雅。

在编程之路上,实践的重要性无可比拟。这也是很多同学感觉学了很多,但还是不会写代码的原因;也是很多有意转行的人士,自学了大半年,仍不见起色的缘故。

leoxin在知识星球发起一项活动:目标是爬取拉钩网的招聘信息以及链家的房产信息,然后对数据进行清洗和存储,并分析其数据下的价值,最后用可视化的形式表现出来。

我觉得难度适中,循序渐进,对于不同身份角色的学习人群都大有裨益。

下面我来写一写在第一阶段的一些学习操作总结和感受。

爬虫

构思/准备部分

首先打开

找工作-互联网招聘求职网-拉勾网www.lagou.com《Python | 爬虫-数据分析实战Ⅰ》

我初步选择的是Java-上海

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

Step1

打开浏览器开发者工具,观察Network部分的内容,首先点进Doc部分,看看服务器给我们返回了哪些文本内容。

在Preview预览中,我们可以看到,大部分都是一些公共视图框架和公共JS代码,没有核心数据。

那么这时我们就应该猜测,网站可能是首先渲染一个公共框架,然后再通过Ajax发送请求去获得数据,再在页面上显示获取的数据。

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

Step2

通过Step1的思考和猜测,大致确定了数据是异步获取的。做过一点web的应该都想得到这一点,因为即使是反爬,也要按照基本法啊!应该不会使用多么多么匪夷所思的黑科技(如果真的出现了,那是我太菜了的原因(っ °Д °;)っ)

这时点开XHR按钮,XHR全称XMLHttpRequest,有什么作用呢?Ajax通过XMLHttpRequest对象发出HTTP请求,得到服务器返回的数据。

通过预览我们可以发现,我们需要的数据都出现在positionAjax请求下返回的数据中,参见content-positionResult-result中。

那么该如何伪造请求?

点进Headers,首先发现 RequestMethod的值是 POST,确定了我们提交请求的方式。然后看看 RequestHeaders中的字段。

发现有好多条。

  1. Accept:application/json, text/Javascript, */*; q=0.01
  2. Accept-Encoding:gzip, deflate, br
  3. Accept-Language:zh-CN,zh;q=0.9
  4. Connection:keep-alive
  5. Content-Length:23
  6. Content-Type:application/x-www-form-urlencoded; charset=UTF-8
  7. COOKIE:XXX
  8. Host:www.lagou.com
  9. Origin:https://www.lagou.com
  10. Referer:https://www.lagou.com/jobs/list_Java?px=default&city=%E4%B8%8A%E6%B5%B7
  11. User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
  12. X-Anit-Forge-Code:0
  13. X-Anit-Forge-Token:None
  14. X-Requested-With:XMLHttpRequest

通过筛选,我们选取其中有用的几条,构建自己的请求头。(那么怎么知道哪些是有用的呢?首先筛除语言,编码之类的,这些的影响一般都是比较小的;接着在剩下的字段中进行尝试,等以后有经验了,自然能准确选取有价值的字段)

由于是POST的请求方式,那么势必会向服务器提交一些数据,可以看到表单信息:

  1. first:true
  2. pn:1
  3. kd:Java

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

实现/代码部分

Step1

在进行上述分析后,基本已经准备得差不多了。这时可以先简单构建一下我们的Proxy类。

  1. class Proxy():
  2. def __init__(self):
  3. self.MAX=5 #最大嗅探次数
  4. self.headers={
  5. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
  6. "Referer":"https://www.lagou.com/jobs/list_Java?px=default&city=%E4%B8%8A%E6%B5%B7",
  7. "X-Anit-Forge-Code":"0",
  8. "X-Anit-Forge-Token":"None",
  9. "X-Requested-With":"XMLHttpRequest"
  10. }
  11. def getPage(self,url,data):
  12. FAILTIME=0 #访问失败次数
  13. try:
  14. result=requests.post(url,headers=self.headers,data=data)
  15. result.encoding = "utf-8"
  16. return result
  17. except:
  18. FAILTIME+=1
  19. if FAILTIME==self.MAX:
  20. print("访问错误")
  21. return ''

上文中提到,发现Ajaxposition返回的content-positionResult-result数据,数据格式是一个数组里有15条数据,每条数据的格式是一个字典,具体如下:

  1. adWord:9
  2. appShow:0
  3. approve:1
  4. businessZones:["唐镇", "唐镇", "曹路", "曹路"]
  5. city:"上海"
  6. companyFullName:"招商银行股份有限公司信用卡中心"
  7. companyId:6796
  8. companyLabelList:["金融科技银行", "技术创新驱动", "奋斗独立改变", "一年两次调薪"]
  9. companyLogo:"i/image2/M00/25/D7/CgoB5lodmL2AJHxrAABieRjcJjU514.png"
  10. companyShortName:"招商银行信用卡中心"
  11. companySize:"2000人以上"
  12. createTime:"2018-03-09 09:14:30"
  13. deliver:0
  14. district:"浦东新区"
  15. education:"本科"
  16. explain:null
  17. financeStage:"上市公司"
  18. firstType:"开发/测试/运维类"
  19. formatCreateTime:"09:14发布"
  20. gradeDescription:null
  21. hitags:null
  22. imState:"today"
  23. industryField:"移动互联网,金融"
  24. industryLables:[]
  25. isSchoolJob:0
  26. jobNature:"全职"
  27. lastLogin:1520581074000
  28. latitude:"31.247248"
  29. linestaion:null
  30. longitude:"121.673868"
  31. pcShow:0
  32. plus:null
  33. positionAdvantage:"五险一金,职位晋升,各类补贴"
  34. positionId:2762378
  35. positionLables:["项目管理", "j2ee", "架构"]
  36. positionName:"Java技术经理"
  37. promotionScoreExplain:null
  38. publisherId:73936
  39. resumeProcessDay:1
  40. resumeProcessRate:100
  41. salary:"30k-50k"
  42. score:0
  43. secondType:"管理岗"
  44. stationname:null
  45. subwayline:null
  46. workYear:"5-10年"

可见返回了大量的信息,那么我们如何去获得这些数据?此时可以写一个简单的Job类:

  1. class Job:
  2. def __init__(self):
  3. self.datalist=[]
  4. def getJob(self,url,data):
  5. p=Proxy()
  6. result=p.getPage(url,data)
  7. result.encoding = "utf-8"
  8. result_dict=result.json()
  9. try:
  10. job_info = result_dict['content']['positionResult']['result']
  11. for info in job_info:
  12. print(info)
  13. return job_info
  14. except:
  15. print("发生解析错误")

使用getJob方法获取的是所有的信息,这其实是不必要的,应该也有所选择,否则将给自己带来压力,对于后续步骤也将带来不便。

Step2

此时,一个简单的爬虫已经编写得差不多了,我们可以进行测试一下。
编写主函数

  1. if __name__ == '__main__':
  2. url="https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E4%B8%8A%E6%B5%B7&needAddtiOnalResult=false&isSchoolJob=0"
  3. job = Job()
  4. all_page_info=[]
  5. for x in range(1,31):
  6. data = {
  7. "first": "false",
  8. "pn": x,
  9. "kd": "Java"
  10. }
  11. current_page_info=job.getJob(url,data)
  12. all_page_info.extend(current_page_info)
  13. print("第%d页已经爬取成功"%x)
  14. time.sleep(5)

可以看到控制台显示:

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

总结

到这里,一个简单的爬虫已经编写完毕了,数据以json格式返回,似乎已经大功告成。而事实是,对于为后面的数据分析做准备工作还差得远,对于爬取海量数据,下面有几点思考。

  • 拉钩网对于同一ip的大量请求行为肯定会进行封禁,所以需要准备代理池。
  • 为了实现高自动化,需要对一系列可能出现的异常情况进行处理,断点处理,确保程序不挂。
  • 为了提高效率,加入多线程。
  • 数据持久化,在持久化之前需要先进行清洗。
  • ……

针对以上问题,需要进一步学习。

公众号:「果核里的图灵」

一条小白的探索之路


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • Python入门后,想要从事自由职业可以做哪方面工作?1.爬虫很多人入门Python的必修课之一就是web开发和爬虫。但是这两项想要赚钱的话 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • ORACLE空间管理实验5:块管理之ASSM下高水位的影响
    数据库|mysql教程ORACLE,空间,管理,实验,ASSM,下高,水位,影响,数据库-mysql教程易语言黑客软件源码,vscode左侧搜索,ubuntu怎么看上一页,ecs搭 ... [详细]
author-avatar
嘛道理
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有